export type LocationResult = BDGeoCoderResult

export interface TMapGeoCoder {
  status: number
  message: string
  request_id: string
  result: TMapGeoCoderResult
}

export interface TMapGeoCoderResult {
  location: {
    /* 纬度 */
    lat: number
    /* 经度 */
    lng: number
  }
  /* 以行政区划+道路+门牌号等信息组成的标准格式化地址 */
  address: string
  /* 结合知名地点形成的描述性地址，更具人性化特点 */
  formatted_address?: {
    /* 推荐使用的地址描述，描述精确性较高 */
    recommend: string
    /* 粗略位置描述 */
    rough: string
  }
  /* 地址部件，address不满足需求时可自行拼接 */
  address_component: {
    /* 国家 */
    nation: string
    /* 省 */
    province: string
    /* 市，如果当前城市为省直辖县级区划，city与district字段均会返回此城市
    注：省直辖县级区划adcode第3和第4位分别为9、0，如济源市adcode为419001 */
    city: string
    /* 区，可能为空字串 */
    district: string
    /* 街道，可能为空字串 */
    street: string
    /* 门牌，可能为空字串 */
    street_number: string
  }
  /* 行政区划信息 */
  ad_info: {
    /* 国家代码（ISO3166标准3位数字码） */
    nation_code: string
    /* 行政区划代码，规则详见：行政区划代码说明(https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistrict#6) */
    adcode: string
    /* 城市代码，由国家码+行政区划代码（提出城市级别）组合而来，总共为9位 */
    city_code: string
    /* 行政区划名称 */
    name: string
    /* 行政区划中心点坐标 */
    location: {
      /* 纬度 */
      lat: number
      /* 经度 */
      lng: number
    }
    /* 国家 */
    nation: string
    /* 省 / 直辖市 */
    province: string
    /* 市 / 地级区 及同级行政区划，如果当前城市为省直辖县级区划，city与district字段均会返回此城市
    注：省直辖县级区划adcode第3和第4位分别为9、0，如济源市adcode为419001 */
    city: string
    /* 区 / 县级市 及同级行政区划 */
    district?: string
  }
  /* 坐标相对位置参考 */
  address_reference?: {
    /* 知名区域，如商圈或人们普遍认为有较高知名度的区域 */
    famous_area?: ObjectTypeA
    /* 商圈，目前与famous_area一致 */
    business_area?: ObjectTypeA
    /* 乡镇街道 */
    town?: ObjectTypeA
    /* 一级地标，可识别性较强、规模较大的地点、小区等
    【注】对象结构同 famous_area */
    landmark_l1?: ObjectTypeA
    /* 二级地标，较一级地标更为精确，规模更小
    【注】：对象结构同 famous_area */
    landmark_l2?: ObjectTypeA
    /* 街道 【注】：对象结构同 famous_area */
    street?: ObjectTypeA
    /* 门牌 【注】：对象结构同 famous_area */
    street_number?: ObjectTypeA
    /* 交叉路口 【注】：对象结构同 famous_area */
    crossroad?: ObjectTypeA
    /* 水系 【注】：对象结构同 famous_area */
    water?: ObjectTypeA
  }
  /* 查询的周边poi的总数，仅在传入参数get_poi=1时返回 */
  poi_count: number
  /* 周边地点（POI）数组，数组中每个子项为一个POI对象 */
  pois: PoiType[]
}

interface ObjectTypeA {
  /* 地点唯一标识 */
  id: string
  /* 名称/标题 */
  title?: string
  /* 坐标 */
  location?: {
    /* 纬度 */
    lat: number
    /* 经度 */
    lng: number
  }
  /* 此参考位置到输入坐标的直线距离 */
  _distance?: number
  /* 此参考位置到输入坐标的方位关系，如：北、南、内 */
  _dir_desc?: string
}

interface PoiType {
  /* 地点（POI）唯一标识 */
  id: string
  /* 名称 */
  title: string
  /* 地址 */
  address: string
  /* 地点分类信息 */
  category: string
  /* 提示所述位置坐标 */
  location: {
    lat: number
    lng: number
  }
  /* 行政区划信息 */
  ad_info?: {
    adcode: number
    province: string
    city: string
    district: string
  }
  /* 该POI到逆地址解析传入的坐标的直线距离 */
  _distance: number
}

/* 地理编码返回结果 */
export interface BDGeoCoderResult {
  // 省ID
  provinceId: string
  // 省名称
  provinceName: string
  // 市ID
  cityId: string
  // 市名称
  cityName: string
  // 县/区ID
  countyId: string
  // 县/区名称
  countyName: string
  // 街道/镇ID
  townId: string
  // 街道/镇名称
  townName: string
  // 村/社区ID
  villageId?: string
  // 村/社区名称
  villageName?: string

  // 街路巷
  streetAlley: string
  // 房屋编号
  houseNo?: string
  // 逆解析地址
  address: string
  // 经纬度
  location: {
    lat: number
    lng: number
  }
}
